
/**
 * 
 * 学生方阵
 * 题目描述

学校组织活动，将学生排成一个矩形方阵。

请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上，方向可以是水平的，垂直的，成对角线的或者呈反对角线的。

注：学生个数不会超过10000
输入描述
输入的第一行为矩阵的行数和列数，

接下来的 n 行为矩阵元素，元素间用 "," 分隔。

输出描述
输出一个整数，表示矩阵中最长的位置相连的男生个数。

用例
输入	3,4
F,M,M,F
F,M,M,F
F,F,F,M
输出	3
说明	

 */

import java.util.Scanner;

/**
  * 题目解析
本题的解题思路其实不难，遍历查找矩阵中每一个M点，然后求该M点的水平、垂直、正对角线、反对角线，四个方向的M点个数，然后保留最大的个数，就是题解。

但是这种方法会存在很多重复的查找，比如



红色M是当前遍历到的M，绿色M是以红色M为原点查找到的M，如上图两个红色M点会重复查找同一条M链。

为了避免这种重复查找，我们可以增加判断：

如果当前M点的

左上角点是M，则反对角线不用查找了
右上角点是M，则正对角线不用查找了
上边点是M，则垂直线不用查找了
左边点是M，最水平线不用查找了


如上图红色M的左上、上、左点都是M，因此红色M的

反对角线已经被其左上点M查找过了，因此不用找了， 
垂直线已经被其上边点M查找过了，因此不用找了
水平线已经被其左边点M查找过了，因此不用找了

  */
public class 学生方阵 {
   
    static int n;
  static int m;
  static String[][] matrix;
 
  public static void main(String[] args) {
    
    Scanner sc = new Scanner(System.in).useDelimiter("[,\n]");
 
    n = sc.nextInt();
    m = sc.nextInt();
 
    matrix = new String[n][m];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        matrix[i][j] = sc.next();
      }
    }
 
    System.out.println(getResult());
  }
 
  public static int getResult() {
    int ans = 0;
 
    int[][] offsets = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
 
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if ("M".equals(matrix[i][j])) {
          for (int[] offset : offsets) {
            int oldI = i - offset[0];
            int oldJ = j - offset[1];
 
            if (oldI >= 0 && oldI < n && oldJ >= 0 && oldJ < m && "M".equals(matrix[oldI][oldJ])) {
              continue;
            }
 
            int len = 1;
            int newI = i + offset[0];
            int newJ = j + offset[1];
 
            while (newI >= 0
                && newI < n
                && newJ >= 0
                && newJ < m
                && "M".equals(matrix[newI][newJ])) {
              len++;
              newI += offset[0];
              newJ += offset[1];
            }
 
            ans = Math.max(ans, len);
          }
        }
      }
    }
 
    return ans;
  }
}
